<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta content="Cask Data, Inc." name="author" />
<meta content="Copyright © 2016-2017 Cask Data, Inc." name="copyright" />


    <meta name="git_release" content="6.1.1">
    <meta name="git_hash" content="05fbac36f9f7aadeb44f5728cea35136dbc243e5">
    <meta name="git_timestamp" content="2020-02-09 08:22:47 +0800">
    <title>Plugin Presentation</title>

    <link rel="stylesheet" href="../../_static/cdap-bootstrap.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/bootstrap-3.3.6/css/bootstrap.min.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/bootstrap-3.3.6/css/bootstrap-theme.min.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/css/bootstrap-sphinx.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/css/cdap-dynamicscrollspy-4.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/css/jquery.mCustomScrollbar.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/css/cdap-jquery.mCustomScrollbar.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/css/abixTreeList-2.css" type="text/css" />
    <link rel="stylesheet" href="../../_static/cdap-bootstrap.css" type="text/css" />

    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '',
        VERSION:     '6.1.1',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  false
      };
    </script>
    <script type="text/javascript" src="../../_static/jquery.js"></script>
    <script type="text/javascript" src="../../_static/underscore.js"></script>
    <script type="text/javascript" src="../../_static/doctools.js"></script>
    <script type="text/javascript" src="../../_static/language_data.js"></script>

    <link rel="shortcut icon" href="../../_static/favicon.ico"/>
    <link rel="index" title="Index" href="../../genindex.html" />
    <link rel="search" title="Search" href="../../search.html" />
    <link rel="top" title="Cask Data Application Platform 6.1.1 Documentation" href="../../index.html" />
    <link rel="up" title="Developing Plugins" href="index.html" />
    <link rel="next" title="Testing Plugins" href="testing-plugins.html" />
    <link rel="prev" title="Creating a Plugin" href="creating-a-plugin.html" />
    <!-- block extrahead -->
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
    <meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
    <meta name="apple-mobile-web-app-capable" content="yes">
    <!-- block extrahead end -->

</head>
<body role="document">

<!-- block navbar -->
<div id="navbar" class="navbar navbar-inverse navbar-default navbar-fixed-top">
    <div class="container-fluid">
      <div class="row">
        <div class="navbar-header">
          <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
          <a class="navbar-brand" href="../../table-of-contents/../../index.html">
            <span><img alt="CDAP logo" src="../../_static/cdap_logo.svg"/></span>
          </a>

          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>

          <div class="pull-right">
            <div class="dropdown version-dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown"
                role="button" aria-haspopup="true" aria-expanded="false">
                v 6.1.1 <span class="caret"></span>
              </a>
              <ul class="dropdown-menu">
                <li><a href="//docs.cdap.io/cdap/5.1.2/en/index.html">v 5.1.2</a></li>
                <li><a href="//docs.cdap.io/cdap/4.3.4/en/index.html">v 4.3.4</a></li>
              </ul>
            </div>
          </div>
          <form class="navbar-form navbar-right navbar-search" action="../../search.html" method="get">
            <div class="form-group">
              <div class="navbar-search-image material-icons"></div>
              <input type="text" name="q" class="form-control" placeholder="  Search" />
            </div>
            <input type="hidden" name="check_keywords" value="yes" />
            <input type="hidden" name="area" value="default" />
          </form>

          <div class="collapse navbar-collapse nav-collapse navbar-right navbar-navigation">
            <ul class="nav navbar-nav"><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link " href="../../table-of-contents/../../index.html">简介</a></li><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link current" href="../../table-of-contents/../../guides.html">手册</a></li><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link " href="../../table-of-contents/../../reference-manual/index.html">参考</a></li><li class="docsite-nav-tab-container"><a class="docsite-nav-tab-link " href="../../table-of-contents/../../faqs/index.html">帮助</a></li>
            </ul>
          </div>

        </div>
      </div>
    </div>
  </div><!-- block navbar end -->
<!-- block main content -->
<div class="main-container container">
  <div class="row"><div class="col-md-2">
      <div id="sidebar" class="bs-sidenav scrollable-y-outside" role="complementary">
<!-- theme_manual: developer-manual -->
<!-- theme_manual_highlight: guides -->
<!-- sidebar_title_link: ../../table-of-contents/../../guides.html -->

  <div role="note" aria-label="manuals links"><h3><a href="../../table-of-contents/../../guides.html">Guides</a></h3>

    <ul class="this-page-menu">
      <li class="toctree-l1"><a href="../../table-of-contents/../../user-guide/index.html" rel="nofollow">用户手册</a>
      </li>
      <li class="toctree-l1"><b><a href="../../table-of-contents/../../developer-manual/index.html" rel="nofollow">开发手册</a></b>
      <nav class="pagenav">
      <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../index.html"> 简介</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../getting-started/index.html"> 入门指南</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../getting-started/sandbox/index.html">CDAP Sandbox</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../getting-started/sandbox/zip.html">二进制 Zip 文件</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../getting-started/sandbox/zip.html#cdap-sandbox">启动和停止 CDAP Sandbox</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../getting-started/sandbox/virtual-machine.html">虚拟机镜像</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../getting-started/sandbox/docker.html">Docker 镜像</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../getting-started/quick-start.html">快速入门</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../getting-started/dev-env.html">搭建开发环境</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../getting-started/start-stop-cdap.html">启动和停止 CDAP</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../getting-started/building-apps.html">构建并运行应用</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../overview/index.html"> 概述</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../overview/anatomy.html"> 大数据应用剖析</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../overview/modes.html"> 模式和组件</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../overview/abstractions.html"> 核心概念</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../overview/interfaces.html"> 编程接口</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../building-blocks/index.html"> 抽象概念</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/core.html"> Core Abstractions</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/applications.html"> Applications</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/datasets/index.html"> Datasets</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/overview.html"> Overview</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/table.html"> Table API</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/fileset.html"> FileSets</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/partitioned-fileset.html"> Partitioned FileSets</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/time-partitioned-fileset.html"> TimePartitioned FileSets</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/system-custom.html"> System and Custom Datasets</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/permissions.html"> Dataset Permissions</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../building-blocks/datasets/cube.html"> Cube Dataset</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/mapreduce-programs.html"> MapReduce Programs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/plugins.html"> Plugins</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/schedules.html"> Schedules</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/secure-keys.html"> Secure Keys</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/services.html"> Services</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/spark-programs.html"> Spark Programs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/workers.html"> Workers</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/workflows.html"> Workflows</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/artifacts.html"> Artifacts</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/program-lifecycle.html"> Program Lifecycle</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/namespaces.html"> Namespaces</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/transaction-system.html"> Transaction System</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../building-blocks/transactional-messaging-system.html"> Transactional Messaging System</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../metadata/index.html"> 元数据</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/system-metadata.html"> System Metadata</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/discovery-lineage.html"> Discovery and Lineage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/field-lineage.html"> Field Level Lineage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/audit-logging.html"> Audit Logging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/metadata-ui.html"> CDAP Metadata UI</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../metadata/programmatic-metadata.html"> Accessing metadata programmatically</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html"> 数据流管道</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../concepts-design.html"> Concepts and Design</a></li>
<li class="toctree-l2"><a class="reference internal" href="../getting-started.html"> Getting Started</a></li>
<li class="toctree-l2"><a class="reference internal" href="../studio.html"> CDAP Studio</a></li>
<li class="toctree-l2"><a class="reference internal" href="../creating-pipelines.html"> Creating Pipelines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../running-pipelines.html"> Running Pipelines</a></li>
<li class="toctree-l2"><a class="reference internal" href="../plugin-management.html"> Plugin Management</a></li>
<li class="toctree-l2"><a class="reference internal" href="../plugins/index.html"> Plugin Reference</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../plugins/actions/index.html"> Action Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/sources/index.html"> Source Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/transforms/index.html"> Transform Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/analytics/index.html"> Analytic Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/sinks/index.html"> Sink Plugins</a><ul class="simple">
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/shared-plugins/index.html"> Shared Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="../plugins/shared-plugins/core.html">CoreValidator</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../plugins/post-run-plugins/index.html"> Post-run Plugins</a><ul class="simple">
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../developing-pipelines.html"> Developing Pipelines</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html"> Developing Plugins</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="plugin-basics.html">Plugin Basics</a></li>
<li class="toctree-l3"><a class="reference internal" href="creating-a-plugin.html">Creating a Plugin</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">Plugin Presentation</a></li>
<li class="toctree-l3"><a class="reference internal" href="testing-plugins.html">Testing Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="packaging-plugins.html">Packaging Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../how-cdap-pipelines-work.html"> How CDAP Pipelines Work</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../cloud-runtimes/index.html"> 云平台运行</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../cloud-runtimes/concepts/index.html"> Concepts</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../cloud-runtimes/provisioners/index.html"> Provisioners</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/provisioners/gcp-dataproc.html">Google Dataproc</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/provisioners/aws-emr.html">Amazon Elastic MapReduce</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/provisioners/remote-hadoop.html">Remote Hadoop</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../cloud-runtimes/profiles/index.html"> Profiles</a><ul>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/profiles/creating-profiles.html">Creating Profiles</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/profiles/assigning-profiles.html">Assigning Profiles</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../cloud-runtimes/profiles/admin-controls.html">Admin Controls</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../cloud-runtimes/example/index.html"> Example</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../security/index.html"> 安全</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../security/client-authentication.html">Client Authentication</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../security/cdap-authentication-clients-java.html">CDAP Authentication Client for Java</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../security/cdap-authentication-clients-python.html">CDAP Authentication Client for Python</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../security/custom-authentication.html">Custom Authentication</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../security/authorization-extensions.html">Authorization Extensions</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../testing/index.html"> 测试和调试</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../testing/testing.html"> Testing a CDAP Application</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../testing/debugging.html"> Debugging</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../testing/troubleshooting.html"> Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../ingesting-tools/index.html"> 数据融合</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../ingesting-tools/cdap-stream-clients-java.html">CDAP Stream Client for Java</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../ingesting-tools/cdap-stream-clients-python.html">CDAP Stream Client for Python</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../ingesting-tools/cdap-stream-clients-ruby.html">CDAP Stream Client for Ruby</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../ingesting-tools/cdap-flume.html">CDAP Flume</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../data-exploration/index.html"> 数据探索</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../data-exploration/filesets.html"> Fileset Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../data-exploration/tables.html"> Table Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../data-exploration/object-mapped-tables.html"> ObjectMappedTable Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../data-exploration/custom-datasets.html"> Custom Dataset Exploration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../data-exploration/hive-execution-engines.html"> Hive Execution Engines</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../advanced/index.html"> 高级主题</a><ul>
<li class="toctree-l2"><a class="reference internal" href="../../advanced/application-logback.html"> Application Logback</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../advanced/best-practices.html"> Best Practices</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../advanced/class-loading.html"> Class Loading</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../advanced/configuring-resources.html"> Configuring Program Resources</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../advanced/program-retry-policies.html"> Program Retry Policies</a></li>
</ul>
</li>
</ul>
</nav>
      </li>
      <li class="toctree-l1"><a href="../../table-of-contents/../../admin-manual/index.html" rel="nofollow">管理手册</a>
      </li>
      <li class="toctree-l1"><a href="../../table-of-contents/../../integrations/index.html" rel="nofollow">集成手册</a>
      </li>
      <li class="toctree-l1"><a href="../../table-of-contents/../../examples-manual/index.html" rel="nofollow">最佳实践</a>
      </li>
    </ul>
  </div></div>
    </div><div class="col-md-8 content" id="main-content">
    
  <div class="section" id="plugin-presentation">
<span id="cdap-pipelines-creating-custom-plugins-widget-json"></span><span id="cdap-pipelines-packaging-plugins-presentation"></span><span id="plugins-presentation"></span><h1>Plugin Presentation<a class="headerlink" href="#plugin-presentation" title="Permalink to this headline">🔗</a></h1>
<p>When a plugin is displayed in the CDAP UI, its properties are represented by widgets in
the CDAP Studio. Each property of a plugin is represented, by default, as a simple
textbox in the user interface. By including an appropriate plugin widget JSON file, you
can customize that presentation to use a different interface, as desired.</p>
<p>The available widgets that can be used are <a class="reference internal" href="#plugins-presentation-widgets"><span class="std std-ref">described below</span></a>. Note that some of the plugins available for CDAP may
include use of additional widgets that are not listed here. We recommend only using the
list of plugins shown here, as these other widgets are internal to CDAP and may not be
supported in a future release.</p>
<p>This document describes version 1.5 of the plugin specification.
Changes to the specification are described in the
<a class="reference internal" href="#plugins-presentation-specification-changes"><span class="std std-ref">Specification Changes</span></a> and should be checked if you are using a
version of the specification earlier than the current.</p>
<div class="section" id="plugin-widget-json">
<span id="plugins-presentation-widget-json"></span><h2>Plugin Widget JSON<a class="headerlink" href="#plugin-widget-json" title="Permalink to this headline">🔗</a></h2>
<p>To customize the plugin display, a plugin can include a widget JSON file that specifies
the particular widgets and the sets of widget attributes used to display the plugin properties
in the CDAP UI.</p>
<p>The widget JSON is composed of:</p>
<ul class="simple">
<li>a map of <a class="reference internal" href="#plugins-presentation-metadata"><span class="std std-ref">metadata</span></a></li>
<li>a list of property <a class="reference internal" href="#plugins-presentation-configuration-groups"><span class="std std-ref">configuration groups</span></a></li>
<li>a map of <a class="reference internal" href="#plugins-presentation-inputs"><span class="std std-ref">inputs</span></a></li>
<li>a list of <a class="reference internal" href="#plugins-presentation-outputs"><span class="std std-ref">outputs</span></a></li>
<li>a map of <a class="reference internal" href="#plugins-presentation-jumps"><span class="std std-ref">stream or dataset jumps</span></a></li>
</ul>
<p>Each configuration group consists of a list of the <a class="reference internal" href="#plugins-presentation-property-configuration"><span class="std std-ref">individual properties</span></a> and the
<a class="reference internal" href="#plugins-presentation-widgets"><span class="std std-ref">widgets</span></a> to be used. For example:</p>
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;metadata&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="c">...</span>
  <span class="p">},</span>
  <span class="nt">&quot;display-name&quot;</span><span class="p">:</span> <span class="s2">&quot;Plugin Display Name&quot;</span><span class="p">,</span>
  <span class="nt">&quot;icon&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;builtin|link|inline&quot;</span><span class="p">,</span>
    <span class="nt">&quot;arguments&quot;</span><span class="p">:</span> <span class="p">{</span>
       <span class="nt">&quot;url&quot;</span><span class="p">:</span> <span class="s2">&quot;http://localhost/myicon.png&quot;</span><span class="p">,</span>
       <span class="nt">&quot;data&quot;</span><span class="p">:</span> <span class="s2">&quot;data:image/png;base64,...&quot;</span>
    <span class="p">}</span>
  <span class="p">},</span>
  <span class="nt">&quot;configuration-groups&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span><span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Group 1&quot;</span><span class="p">,</span>
      <span class="nt">&quot;properties&quot;</span><span class="p">:</span> <span class="p">[</span>
      <span class="c">...</span>
      <span class="p">]</span>
    <span class="p">},</span>
    <span class="p">{</span><span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Group 2&quot;</span><span class="p">,</span>
      <span class="nt">&quot;properties&quot;</span><span class="p">:</span> <span class="p">[</span>
      <span class="c">...</span>
      <span class="p">]</span>
    <span class="p">},</span>
    <span class="c">...</span>
  <span class="p">],</span>
  <span class="nt">&quot;inputs&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="c">...</span>
  <span class="p">},</span>
  <span class="nt">&quot;outputs&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span><span class="nt">&quot;output-property-1&quot;</span><span class="p">},</span>
    <span class="p">{</span><span class="nt">&quot;output-property-2&quot;</span><span class="p">},</span>
    <span class="c">...</span>
  <span class="p">],</span>
  <span class="nt">&quot;jump-config&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="c">...</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<div class="section" id="metadata">
<span id="plugins-presentation-metadata"></span><h3>Metadata<a class="headerlink" href="#metadata" title="Permalink to this headline">🔗</a></h3>
<p>Metadata refers to the top-level information about a plugin. The only information required is the
a <em>map</em> consisting of the <code class="docutils literal notranslate"><span class="pre">spec-version</span></code>, the version of the specification which the JSON follows.</p>
<p>Current version: 1.5. For example:</p>
<pre class="literal-block">
{
  &quot;metadata&quot;: {
    &quot;spec-version&quot; : &quot;1.5&quot;
  },
  ...
}
</pre>
</div>
<div class="section" id="display-name">
<span id="plugins-presentation-display-name"></span><h3>Display Name<a class="headerlink" href="#display-name" title="Permalink to this headline">🔗</a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">display-name</span></code> field specifies the name of the plugin as it is displayed on the CDAP UI. A display name can be
different from the plugin name, and is not guaranteed to be unique. A display name can contain whitespace. If not
specified, the plugin name is used as the display name.</p>
</div>
<div class="section" id="icon">
<span id="plugins-presentation-icon"></span><h3>Icon<a class="headerlink" href="#icon" title="Permalink to this headline">🔗</a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">icon</span></code> field allows users to specify custom icons for their plugins. Users can specify icons for their plugins in
three different ways, depending on the value of the <code class="docutils literal notranslate"><span class="pre">type</span></code> field contained inside the <code class="docutils literal notranslate"><span class="pre">icon</span></code> field:</p>
<ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">builtin</span></code>: The icon type <code class="docutils literal notranslate"><span class="pre">builtin</span></code> indicates that the icon for the plugin is defined in CDAP, and is not specified in the plugin’s widget JSON file. This is the default icon type, if an icon is not specified. If such an icon is not found, the CDAP UI will use a default icon type.</li>
<li><code class="docutils literal notranslate"><span class="pre">link</span></code>: The icon type <code class="docutils literal notranslate"><span class="pre">link</span></code> indicates that the icon for the plugin should be fetched from a URL specified in the <code class="docutils literal notranslate"><span class="pre">arguments</span></code> map. When the type of icon is <code class="docutils literal notranslate"><span class="pre">link</span></code>, the user is expected to provide a link to the icon image in a <code class="docutils literal notranslate"><span class="pre">url</span></code> attribute inside the <code class="docutils literal notranslate"><span class="pre">arguments</span></code> map.</li>
<li><code class="docutils literal notranslate"><span class="pre">inline</span></code>: The icon type <code class="docutils literal notranslate"><span class="pre">inline</span></code> indicates that the icon for the plugin should be decoded from a base64 encoded image specified in the <code class="docutils literal notranslate"><span class="pre">arguments</span></code> map. When the type of icon is <code class="docutils literal notranslate"><span class="pre">inline</span></code>, the user is expected to provide a base64 encoded image in a <code class="docutils literal notranslate"><span class="pre">data</span></code> attribute inside the <code class="docutils literal notranslate"><span class="pre">arguments</span></code> map.</li>
</ul>
<p id="plugins-presentation-icon-image-specification"><strong>Icon Image Specification</strong>
- The image used for an icon for a CDAP plugin should be in PNG format (<a class="reference external" href="http://www.libpng.org/pub/png/">http://www.libpng.org/pub/png/</a>).
- The size of the image should be 50 X 50 pixels.
- The image background should be transparent.</p>
</div>
<div class="section" id="configuration-groups">
<span id="plugins-presentation-configuration-groups"></span><h3>Configuration Groups<a class="headerlink" href="#configuration-groups" title="Permalink to this headline">🔗</a></h3>
<p>Configuration groups are a simple grouping of properties of a plugin. A configuration
group is represented as a JSON object with a <em>label</em> and an ordered <em>list</em> of plugin
properties for that group.</p>
<p>For example, in a <em>Batch Source</em> plugin, properties such as <code class="docutils literal notranslate"><span class="pre">name</span></code>, <code class="docutils literal notranslate"><span class="pre">basePath</span></code>,
<code class="docutils literal notranslate"><span class="pre">duration</span></code>, and <code class="docutils literal notranslate"><span class="pre">delay</span></code> could be grouped into a <em>Batch Source Configuration</em>.</p>
<p>In the case of a <em>Batch Source</em> plugin, it could look like this:</p>
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;configuration-groups&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Batch Source Configuration&quot;</span><span class="p">,</span>
      <span class="nt">&quot;properties&quot;</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;name&quot;</span><span class="p">,</span>
          <span class="c">...</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;basePath&quot;</span><span class="p">,</span>
          <span class="c">...</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;duration&quot;</span><span class="p">,</span>
          <span class="c">...</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;delay&quot;</span><span class="p">,</span>
          <span class="c">...</span>
        <span class="p">}</span>
      <span class="p">]</span>
    <span class="p">}</span>
  <span class="p">]</span>
  <span class="c">...</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Once a group is established, you can configure how each of the individual properties
inside the group is represented in the CDAP UI.</p>
</div>
<div class="section" id="property-configuration">
<span id="plugins-presentation-property-configuration"></span><h3>Property Configuration<a class="headerlink" href="#property-configuration" title="Permalink to this headline">🔗</a></h3>
<p>Each individual property of the plugin is represented by a configuration, composed of:</p>
<ul class="simple">
<li><strong>name:</strong> Name of the field (as supplied by the CDAP server for the artifact).</li>
<li><strong>label:</strong> Text string displayed in the CDAP UI beside the widget.</li>
<li><a class="reference internal" href="#plugins-presentation-widgets"><span class="std std-ref">widget-type:</span></a> The type of
widget to be used to represent this property.</li>
<li><a class="reference internal" href="#plugins-presentation-widgets"><span class="std std-ref">widget-attributes:</span></a> A map of attributes that the
widget type requires to be defined in order to render the property in the CDAP UI. The
attributes required depend on the widget type used.</li>
<li><a class="reference internal" href="#plugins-presentation-plugin-function"><span class="std std-ref">plugin-function:</span></a>
An optional map of plugin method and its widget attributes that can be applied to a
particular plugin property.</li>
</ul>
<p>Note that all properties and property values are case-sensitive.</p>
<p>To find the available field names, you can use the <span class="xref std std-ref">Artifact HTTP RESTful API</span> to <span class="xref std std-ref">retrieve plugin details</span> for an artifact, which will include all the
available field names. (If the artifact is your own, you will already know the available
field names from your source code.)</p>
<p>In this example of a <em>Batch Source</em> plugin and its <code class="docutils literal notranslate"><span class="pre">configuration-groups</span></code>, four
different properties are defined; three use a <em>textbox</em> widget, while one uses a
<em>dataset-selector</em>. The <em>groupByFields</em> property includes a <a class="reference internal" href="#plugins-presentation-plugin-function"><span class="std std-ref">plugin function</span></a>, used to fetch an output schema for the widget:</p>
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;configuration-groups&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Batch Source&quot;</span><span class="p">,</span>
      <span class="nt">&quot;properties&quot;</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;name&quot;</span><span class="p">,</span>
          <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Dataset&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;dataset-selector&quot;</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;basePath&quot;</span><span class="p">,</span>
          <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Base Path&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;groupByFields&quot;</span><span class="p">,</span>
          <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Group By Fields&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span><span class="p">,</span>
          <span class="nt">&quot;plugin-function&quot;</span><span class="p">:</span> <span class="p">{</span>
            <span class="nt">&quot;method&quot;</span><span class="p">:</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span>
            <span class="nt">&quot;widget&quot;</span><span class="p">:</span> <span class="s2">&quot;outputSchema&quot;</span><span class="p">,</span>
            <span class="nt">&quot;plugin-method&quot;</span><span class="p">:</span> <span class="s2">&quot;outputSchema&quot;</span><span class="p">,</span>
            <span class="nt">&quot;required-fields&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;groupByFields&quot;</span><span class="p">,</span> <span class="s2">&quot;aggregates&quot;</span><span class="p">],</span>
            <span class="nt">&quot;missing-required-fields-message&quot;</span><span class="p">:</span>
              <span class="s2">&quot;&#39;Group By Fields&#39; &amp; &#39;Aggregates&#39; properties are required to fetch schema.&quot;</span>
          <span class="p">}</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;duration&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span>
        <span class="p">},</span>
        <span class="c">...</span>
      <span class="p">]</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="plugin-widgets">
<span id="plugins-presentation-widgets"></span><h2>Plugin Widgets<a class="headerlink" href="#plugin-widgets" title="Permalink to this headline">🔗</a></h2>
<p>A widget in the CDAP UI represents a component that will be rendered and used to set the
value of a property of a plugin. These are the different widgets—their type, their
attributes (if any), their output data type, a description, sample JSON—that we support in
CDAP pipelines as of version 6.1.1.</p>
<table border="1" class="docutils">
<colgroup>
<col width="15%" />
<col width="20%" />
<col width="15%" />
<col width="20%" />
<col width="30%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Widget Type</th>
<th class="head">Widget Attributes</th>
<th class="head">Output Data Type</th>
<th class="head">Description</th>
<th class="head">Example Widget JSON</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">csv</span></code></td>
<td>No attributes</td>
<td>Comma-separated <code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>Comma-separated values; each value is entered in a separate box</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-csv&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;csv&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">dataset-selector</span></code></td>
<td>No attributes</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>A type-ahead textbox with a list of datasets from the CDAP instance</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-dataset-selector&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;dataset-selector&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">ds-multiplevalues</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">delimiter</span></code>: the delimiter between each <em>set</em> of values</li>
<li><code class="docutils literal notranslate"><span class="pre">numValues</span></code>: number of values (number of delimiter-separated values)</li>
<li><code class="docutils literal notranslate"><span class="pre">placeholders</span></code>: array of placeholders for each value’s textbox</li>
<li><code class="docutils literal notranslate"><span class="pre">values-delimiter</span></code>: the delimiter between each value</li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>A delimiter-separated values widget that allows specifying lists of values
separated by delimiters</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-ds-multiplevalues&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;ds-multiplevalues&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;delimiter&quot;</span><span class="p">:</span> <span class="s2">&quot;,&quot;</span><span class="p">,</span>
    <span class="nt">&quot;values-delimiter&quot;</span><span class="p">:</span> <span class="s2">&quot;:&quot;</span><span class="p">,</span>
    <span class="nt">&quot;numValues&quot;</span><span class="p">:</span> <span class="s2">&quot;3&quot;</span><span class="p">,</span>
    <span class="nt">&quot;placeholders&quot;</span><span class="p">:</span> <span class="p">[</span>
      <span class="s2">&quot;Input Field&quot;</span><span class="p">,</span>
      <span class="s2">&quot;Lookup&quot;</span><span class="p">,</span>
      <span class="s2">&quot;Output Field&quot;</span>
    <span class="p">]</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">dsv</span></code></td>
<td><code class="docutils literal notranslate"><span class="pre">delimiter</span></code>: delimiter used to separate the values</td>
<td>Delimiter-separated <code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>Delimiter-separated values; each value is entered in a separate box</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-dsv&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;dsv&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;delimiter&quot;</span><span class="p">:</span> <span class="s2">&quot;:&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">hidden</span></code></td>
<td><code class="docutils literal notranslate"><span class="pre">default</span></code>: default <code class="docutils literal notranslate"><span class="pre">string</span></code> value for the widget</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>This “hidden” widget allows values to be set for a property but hidden from users.
A default can be supplied that will be used as the value for the property.</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-hidden&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;hidden&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;default&quot;</span><span class="p">:</span> <span class="s2">&quot;defaultValue&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">input-field-selector</span></code></td>
<td>No attributes</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>A dropdown widget with a list of columns taken from the input schema.
Selecting sets the input column for that plugin property.</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;Property1&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;csv&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">javascript-editor</span></code></td>
<td><code class="docutils literal notranslate"><span class="pre">default</span></code>: default <code class="docutils literal notranslate"><span class="pre">string</span></code> value for the widget</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>An editor to write JavaScript code as a value of a property</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-javascript-editor&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;javascript-editor&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;default&quot;</span><span class="p">:</span>
      <span class="s2">&quot;function transform(input, emitter, context) {\</span>
<span class="s2">\\n  emitter.emit(input);\\n}&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">json-editor</span></code></td>
<td><code class="docutils literal notranslate"><span class="pre">default</span></code>: default serialized JSON value for the widget</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>A JSON editor that pretty-prints and auto-formats JSON while it is being entered</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-json-editor&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;json-editor&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;default&quot;</span><span class="p">:</span> <span class="s2">&quot;{ \&quot;p1\&quot;: \&quot;value\&quot; }&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">keyvalue</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">delimiter</span></code>: delimiter for the key-value pairs</li>
<li><code class="docutils literal notranslate"><span class="pre">kv-delimiter</span></code>: delimiter between key and value</li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>A key-value editor for constructing maps of key-value pairs</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-keyvalue&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;keyvalue&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
      <span class="nt">&quot;delimiter&quot;</span><span class="p">:</span> <span class="s2">&quot;,&quot;</span><span class="p">,</span>
      <span class="nt">&quot;kv-delimiter&quot;</span><span class="p">:</span> <span class="s2">&quot;:&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">multi-select</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">delimiter</span></code>: delimiter to concatenate multiple values to form a single string</li>
<li><code class="docutils literal notranslate"><span class="pre">options</span></code>: array of options where each option is defined by
- <code class="docutils literal notranslate"><span class="pre">id</span></code>: value to be set for the plugin property
- <code class="docutils literal notranslate"><span class="pre">label</span></code>: a label to be rendered in UI for that specific option</li>
<li><code class="docutils literal notranslate"><span class="pre">defaultValue</span></code>: an array of default value(s) to use when rendering the widget for the first time</li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>Multi-select dropdown to choose one or more from a list of available options.</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-keyvalue&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;multi-select&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;delimiter&quot;</span><span class="p">:</span> <span class="s2">&quot;,&quot;</span><span class="p">,</span>
    <span class="nt">&quot;defaultValue&quot;</span><span class="p">:</span> <span class="p">[</span>
      <span class="s2">&quot;value1&quot;</span><span class="p">,</span>
      <span class="s2">&quot;value2&quot;</span>
    <span class="p">],</span>
    <span class="nt">&quot;options&quot;</span><span class="p">:</span> <span class="p">[</span>
      <span class="p">{</span>
        <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="s2">&quot;value1&quot;</span><span class="p">,</span>
        <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Value One&quot;</span>
      <span class="p">},</span>
      <span class="p">{</span>
        <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="s2">&quot;value2&quot;</span><span class="p">,</span>
        <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Value two&quot;</span>
      <span class="p">}</span>
    <span class="p">]</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">radio-group</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">layout</span></code>: Layout for the radio buttons to render. Defaults to <cite>block</cite> to render one below the other. Another option is <cite>inline</cite> to render side-by-side</li>
<li><code class="docutils literal notranslate"><span class="pre">options</span></code>: an array of options where each option is defined by
- <code class="docutils literal notranslate"><span class="pre">id</span></code>: value to be set for the plugin property
- <code class="docutils literal notranslate"><span class="pre">label</span></code>: a label to be rendered in UI for that specific option</li>
<li><code class="docutils literal notranslate"><span class="pre">default</span></code>: default value to use when no value is specified</li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>A group of radio buttons to choose one among a list of available options.</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-keyvalue&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;radio-group&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;layout&quot;</span><span class="p">:</span> <span class="s2">&quot;inline&quot;</span><span class="p">,</span>
    <span class="nt">&quot;default&quot;</span><span class="p">:</span> <span class="s2">&quot;value1&quot;</span><span class="p">,</span>
    <span class="nt">&quot;options&quot;</span><span class="p">:</span> <span class="p">[</span>
      <span class="p">{</span>
        <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="s2">&quot;value1&quot;</span><span class="p">,</span>
        <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Value One&quot;</span>
      <span class="p">},</span>
      <span class="p">{</span>
        <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="s2">&quot;value2&quot;</span><span class="p">,</span>
        <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Value two&quot;</span>
      <span class="p">}</span>
    <span class="p">]</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">keyvalue-dropdown</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">delimiter</span></code>: delimiter for the key-value pairs</li>
<li><code class="docutils literal notranslate"><span class="pre">dropdownOptions</span></code>: list of drop-down options to display</li>
<li><code class="docutils literal notranslate"><span class="pre">kv-delimiter</span></code>: delimiter between key and value</li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>Similar to <em>keyvalue</em> widget, but with a drop-down value list</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-keyvalue-dropdown&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;keyvalue-dropdown&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
      <span class="nt">&quot;delimiter&quot;</span><span class="p">:</span> <span class="s2">&quot;,&quot;</span><span class="p">,</span>
      <span class="nt">&quot;kv-delimiter&quot;</span><span class="p">:</span> <span class="s2">&quot;:&quot;</span><span class="p">,</span>
      <span class="nt">&quot;dropdownOptions&quot;</span><span class="p">:</span> <span class="p">[</span> <span class="s2">&quot;Option1&quot;</span><span class="p">,</span> <span class="s2">&quot;Option2&quot;</span><span class="p">]</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">non-editable-schema-editor</span></code></td>
<td><code class="docutils literal notranslate"><span class="pre">schema</span></code>: schema that will be used as the output schema for the plugin</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>A non-editable widget for displaying a schema</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-non-editable-schema-editor&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;non-editable-schema-editor&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">number</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">default</span></code>: default value for the widget</li>
<li><code class="docutils literal notranslate"><span class="pre">max</span></code>: maximum value for the number box</li>
<li><code class="docutils literal notranslate"><span class="pre">min</span></code>: minimum value for the number box</li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>Default HTML number textbox that only accepts valid numbers</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-number&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;number&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;default&quot;</span><span class="p">:</span> <span class="s2">&quot;1&quot;</span><span class="p">,</span>
    <span class="nt">&quot;min&quot;</span><span class="p">:</span> <span class="s2">&quot;1&quot;</span><span class="p">,</span>
    <span class="nt">&quot;max&quot;</span><span class="p">:</span> <span class="s2">&quot;100&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">password</span></code></td>
<td>No attributes</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>Default HTML password entry box</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-password&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;password&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">python-editor</span></code></td>
<td><code class="docutils literal notranslate"><span class="pre">default</span></code>: default <code class="docutils literal notranslate"><span class="pre">string</span></code> value for the widget</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>An editor to write Python code as a value of a property</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-python-editor&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;python-editor&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;default&quot;</span><span class="p">:</span>
      <span class="s2">&quot;def transform(input, emitter, context):\</span>
<span class="s2">\\n  emitter.emit(input)\\n&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">schema</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">schema-default-type</span></code>: default type for each newly-added field in the schema</li>
<li><code class="docutils literal notranslate"><span class="pre">schema-types</span></code>: list of schema types for each field from which the user can chose when setting the schema</li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>A four-column, editable table for representing the schema of a plugin</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-schema&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;schema&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;schema-default-type&quot;</span><span class="p">:</span> <span class="s2">&quot;string&quot;</span><span class="p">,</span>
    <span class="nt">&quot;schema-types&quot;</span><span class="p">:</span> <span class="p">[</span>
      <span class="s2">&quot;boolean&quot;</span><span class="p">,</span>
      <span class="s2">&quot;int&quot;</span><span class="p">,</span>
      <span class="s2">&quot;long&quot;</span><span class="p">,</span>
      <span class="s2">&quot;float&quot;</span><span class="p">,</span>
      <span class="s2">&quot;double&quot;</span><span class="p">,</span>
      <span class="s2">&quot;bytes&quot;</span><span class="p">,</span>
      <span class="s2">&quot;string&quot;</span><span class="p">,</span>
      <span class="s2">&quot;map&lt;string, string&gt;&quot;</span>
    <span class="p">]</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">select</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">default</span></code>: default value from the list</li>
<li><code class="docutils literal notranslate"><span class="pre">values</span></code>: list of values for the drop-down</li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>An HTML drop-down with a list of values; allows one choice from the list</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-select&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;select&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
      <span class="nt">&quot;default&quot;</span><span class="p">:</span> <span class="s2">&quot;Bananas&quot;</span><span class="p">,</span>
      <span class="nt">&quot;values&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;Apples&quot;</span><span class="p">,</span> <span class="s2">&quot;Oranges&quot;</span><span class="p">,</span> <span class="s2">&quot;Bananas&quot;</span><span class="p">]</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">stream-selector</span></code></td>
<td>No attributes</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>A type-ahead textbox with a list of streams from the CDAP instance</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-stream-selector&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;stream-selector&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">textarea</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">default</span></code>: default value for the widget</li>
<li><code class="docutils literal notranslate"><span class="pre">rows</span></code>: height of the <code class="docutils literal notranslate"><span class="pre">textarea</span></code></li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>An HTML <code class="docutils literal notranslate"><span class="pre">textarea</span></code> element which accepts a default value attribute and a height in rows</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-textarea&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textarea&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;default&quot;</span><span class="p">:</span> <span class="s2">&quot;Default text.&quot;</span><span class="p">,</span>
    <span class="nt">&quot;rows&quot;</span><span class="p">:</span> <span class="s2">&quot;1&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">textarea-validate</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">placeholder</span></code>: placeholder text for the textarea</li>
<li><code class="docutils literal notranslate"><span class="pre">validate-endpoint</span></code>: plugin function endpoint to hit to validate the contents of the textarea</li>
<li><code class="docutils literal notranslate"><span class="pre">validate-button-text</span></code>: label of the validate button</li>
<li><code class="docutils literal notranslate"><span class="pre">validate-success-message</span></code>: message to display when validation succeeds</li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>An HTML <code class="docutils literal notranslate"><span class="pre">textarea</span></code> element with a button to validate its contents using a plugin function endpoint</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-to-validate&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textarea-validate&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s2">&quot;E.g. ((token[&#39;Data Quality&#39;][&#39;error&#39;] / token[&#39;File&#39;][&#39;output&#39;]) * 100) &gt; runtime[&#39;error_percentage&#39;]&quot;</span><span class="p">,</span>
    <span class="nt">&quot;validate-endpoint&quot;</span><span class="p">:</span> <span class="s2">&quot;validate&quot;</span><span class="p">,</span>
    <span class="nt">&quot;validate-button-text&quot;</span><span class="p">:</span> <span class="s2">&quot;Validate&quot;</span><span class="p">,</span>
    <span class="nt">&quot;validate-success-message&quot;</span><span class="p">:</span> <span class="s2">&quot;Expression is valid&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">textbox</span></code></td>
<td><code class="docutils literal notranslate"><span class="pre">default</span></code>: default value for the widget</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>An HTML textbox, used to enter any string, with a default value attribute</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-textbox&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;default&quot;</span><span class="p">:</span> <span class="s2">&quot;Default text.&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">toggle</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">on</span></code>: ‘On’ state of the toggle, defined by <code class="docutils literal notranslate"><span class="pre">value</span></code> - value to be set for the plugin property, and
<code class="docutils literal notranslate"><span class="pre">label</span></code> - a label to be rendered in UI, limited to 64 characters.</li>
<li><code class="docutils literal notranslate"><span class="pre">off</span></code>: ‘Off’ state of the toggle, defined by <code class="docutils literal notranslate"><span class="pre">value</span></code> - value to be set for the plugin property, and
<code class="docutils literal notranslate"><span class="pre">label</span></code> - a label to be rendered in UI, limited to 64 characters.</li>
<li><code class="docutils literal notranslate"><span class="pre">default</span></code>: default value for the widget</li>
</ul>
</td>
<td><code class="docutils literal notranslate"><span class="pre">string</span></code></td>
<td>A toggle widget that allows toggling between ‘on’ and ‘off’ states</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;property-toggle&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;toggle&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;on&quot;</span><span class="p">:</span> <span class="p">{</span>
      <span class="nt">&quot;value&quot;</span><span class="p">:</span> <span class="s2">&quot;on&quot;</span><span class="p">,</span>
      <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;On&quot;</span>
    <span class="p">},</span>
    <span class="nt">&quot;off&quot;</span><span class="p">:</span> <span class="p">{</span>
      <span class="nt">&quot;value&quot;</span><span class="p">:</span> <span class="s2">&quot;off&quot;</span><span class="p">,</span>
      <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Off&quot;</span>
    <span class="p">},</span>
    <span class="nt">&quot;default&quot;</span><span class="p">:</span> <span class="s2">&quot;on&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
<div class="section" id="plugin-function">
<span id="plugins-presentation-plugin-function"></span><h3>Plugin Function<a class="headerlink" href="#plugin-function" title="Permalink to this headline">🔗</a></h3>
<p>A plugin function is a method exposed by a particular plugin that can be used for a
specific task, such as fetching an output schema for a plugin.</p>
<p>These fields need to be configured to use the plugin functions in the CDAP UI:</p>
<ul class="simple">
<li><strong>method:</strong> Type of request to make when calling the plugin function from the CDAP UI
(for example: GET or POST)</li>
<li><strong>widget:</strong> Type of widget to use to import output schema</li>
<li><strong>plugin-method:</strong> Name of the plugin method to call (as exposed by the plugin)</li>
<li><strong>required-fields:</strong> Fields required to call the plugin method</li>
<li><strong>missing-required-fields-message:</strong> A message for the user as to why the action is
disabled in the CDAP UI, displayed when required fields are missing values</li>
</ul>
<p>The last two properties (<em>required-fields</em> and <em>missing-required-fields-message</em>) are
solely for use by the CDAP UI and are not required for all widgets. However, the first four
fields are required fields to use a plugin method of the plugin in the CDAP UI.</p>
<p>With plugin functions, if the widget is not supported in the CDAP UI or the
plugin function map is not supplied, the user will not see the widget in the CDAP UI.</p>
<table border="1" class="docutils">
<colgroup>
<col width="18%" />
<col width="24%" />
<col width="24%" />
<col width="35%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Widget Type</th>
<th class="head">Widget attributes</th>
<th class="head">Description</th>
<th class="head">Example Widget JSON</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">outputSchema</span></code></td>
<td><ul class="first last simple">
<li><code class="docutils literal notranslate"><span class="pre">label</span></code>: Label for the button</li>
<li><code class="docutils literal notranslate"><span class="pre">btnClass</span></code>: bootstrap css class to add to the button</li>
<li><code class="docutils literal notranslate"><span class="pre">multiple-inputs</span></code>: boolean to indicate if there are multiple input schemas</li>
</ul>
</td>
<td>Widget to populate output schema for a plugin.
This is specifically used to populate output schema and not any other property.</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;csv&quot;</span><span class="p">,</span>
  <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Group by fields&quot;</span><span class="p">,</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;groupByFields&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;delimiter&quot;</span><span class="p">:</span> <span class="s2">&quot;,&quot;</span><span class="p">,</span>
    <span class="nt">&quot;value-placeholder&quot;</span><span class="p">:</span> <span class="s2">&quot;Field Name&quot;</span>
  <span class="p">},</span>
  <span class="nt">&quot;plugin-function&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;method&quot;</span><span class="p">:</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span>
    <span class="nt">&quot;widget&quot;</span><span class="p">:</span> <span class="s2">&quot;outputSchema&quot;</span><span class="p">,</span>
    <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Get output schema&quot;</span><span class="p">,</span>
    <span class="nt">&quot;button-class&quot;</span><span class="p">:</span> <span class="s2">&quot;btn-primary&quot;</span><span class="p">,</span>
    <span class="nt">&quot;plugin-method&quot;</span><span class="p">:</span> <span class="s2">&quot;outputSchema&quot;</span><span class="p">,</span>
    <span class="nt">&quot;required-fields&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;groupByFields&quot;</span><span class="p">,</span> <span class="s2">&quot;aggregates&quot;</span><span class="p">],</span>
    <span class="nt">&quot;missing-required-fields-message&quot;</span><span class="p">:</span> <span class="s2">&quot;&#39;Group By Fields&#39; &amp; &#39;Aggregates&#39; properties are required to fetch schema.&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">getPropertyValue</span></code></td>
<td><code class="docutils literal notranslate"><span class="pre">label</span></code>: Label for the button</td>
<td>Widget to populate any property in a plugin. This widget should be used in the property which needs to
fetch its value from a plugin function implemented in the plugin backend</td>
<td><div class="copyable copyable-text first last container">
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;select&quot;</span><span class="p">,</span>
  <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Format&quot;</span><span class="p">,</span>
  <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;format&quot;</span><span class="p">,</span>
  <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;values&quot;</span><span class="p">:</span> <span class="p">[</span>
      <span class="s2">&quot;avro&quot;</span><span class="p">,</span>
      <span class="s2">&quot;blob&quot;</span><span class="p">,</span>
      <span class="s2">&quot;csv&quot;</span><span class="p">,</span>
      <span class="s2">&quot;delimited&quot;</span><span class="p">,</span>
      <span class="s2">&quot;json&quot;</span><span class="p">,</span>
      <span class="s2">&quot;parquet&quot;</span><span class="p">,</span>
      <span class="s2">&quot;text&quot;</span><span class="p">,</span>
      <span class="s2">&quot;tsv&quot;</span>
    <span class="p">],</span>
    <span class="nt">&quot;default&quot;</span><span class="p">:</span> <span class="s2">&quot;text&quot;</span>
  <span class="p">},</span>
  <span class="nt">&quot;plugin-function&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;method&quot;</span><span class="p">:</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span>
    <span class="nt">&quot;widget&quot;</span><span class="p">:</span> <span class="s2">&quot;getPropertyValue&quot;</span><span class="p">,</span>
    <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
      <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Get Schema Value&quot;</span>
    <span class="p">},</span>
    <span class="nt">&quot;required-fields&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;path&quot;</span><span class="p">],</span>
    <span class="nt">&quot;missing-required-fields-message&quot;</span><span class="p">:</span> <span class="s2">&quot;Please provide path field&quot;</span><span class="p">,</span>
    <span class="nt">&quot;plugin-method&quot;</span><span class="p">:</span> <span class="s2">&quot;getSchema&quot;</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="section" id="example-plugin">
<h3>Example Plugin<a class="headerlink" href="#example-plugin" title="Permalink to this headline">🔗</a></h3>
<p>In the case of a <em>Batch Source</em> plugin example, the <code class="docutils literal notranslate"><span class="pre">configuration-groups</span></code>, with
additional widgets to show the <code class="docutils literal notranslate"><span class="pre">groupByFields</span></code> and <code class="docutils literal notranslate"><span class="pre">aggregates</span></code> properties and using a
plugin-function, could be represented by:</p>
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;configuration-groups&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Batch Source&quot;</span><span class="p">,</span>
      <span class="nt">&quot;properties&quot;</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;name&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;dataset-selector&quot;</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;basePath&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;groupByFields&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span><span class="p">,</span>
          <span class="nt">&quot;plugin-function&quot;</span><span class="p">:</span> <span class="p">{</span>
            <span class="nt">&quot;method&quot;</span><span class="p">:</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span>
            <span class="nt">&quot;widget&quot;</span><span class="p">:</span> <span class="s2">&quot;outputSchema&quot;</span><span class="p">,</span>
            <span class="nt">&quot;plugin-method&quot;</span><span class="p">:</span> <span class="s2">&quot;outputSchema&quot;</span><span class="p">,</span>
            <span class="nt">&quot;required-fields&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;groupByFields&quot;</span><span class="p">,</span> <span class="s2">&quot;aggregates&quot;</span><span class="p">],</span>
            <span class="nt">&quot;missing-required-fields-message&quot;</span><span class="p">:</span>
              <span class="s2">&quot;Both &#39;Group By Fields&#39; and &#39;Aggregates&#39; properties are required to fetch the schema.&quot;</span>
          <span class="p">}</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;aggregates&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;duration&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;duration&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span>
        <span class="p">},</span>
        <span class="c">...</span>
      <span class="p">]</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="inputs">
<span id="plugins-presentation-inputs"></span><h3>Inputs<a class="headerlink" href="#inputs" title="Permalink to this headline">🔗</a></h3>
<p>Beginning with version 1.2 of the specification, a plugin can accept multiple input
schemas and from them generate a single output schema. Using the field <code class="docutils literal notranslate"><span class="pre">multipleInputs</span></code>
and setting it to true tells the CDAP UI to show the multiple input schemas coming into a
specific plugin, instead of assuming that all of the schemas coming in from different
plugins are identical.</p>
<p>This is an optional object, and if it is not present, it is assumed that all of the
schemas coming in from any connected plugins are identical. Currently, only one value
(<code class="docutils literal notranslate"><span class="pre">multipleInputs</span></code>) is accepted.</p>
<p>For example:</p>
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;metadata&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="c">...</span>
  <span class="p">},</span>
  <span class="nt">&quot;configuration-groups&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="c">...</span>
  <span class="p">],</span>
  <span class="nt">&quot;inputs&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;multipleInputs&quot;</span><span class="p">:</span> <span class="kc">true</span>
  <span class="p">},</span>
  <span class="nt">&quot;outputs&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="c">...</span>
  <span class="p">]</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="outputs">
<span id="plugins-presentation-outputs"></span><h3>Outputs<a class="headerlink" href="#outputs" title="Permalink to this headline">🔗</a></h3>
<p>The <em>outputs</em> is a list of plugin properties that represent the output schema of a
particular plugin.</p>
<p>The output schema for a plugin can be represented in two different ways, either:</p>
<ul class="simple">
<li>via an <em>explicit schema</em> using a named property; or</li>
<li>via an <em>implicit schema</em></li>
</ul>
<p>Output properties are configured in a similar manner as individual properties in
configuration groups. They are composed of a name and a widget-type, one of either
<code class="docutils literal notranslate"><span class="pre">schema</span></code> (for an <em>explicit schema</em>) or <code class="docutils literal notranslate"><span class="pre">non-editable-schema-editor</span></code> (for an <em>implicit
schema</em>).</p>
<p>With the <code class="docutils literal notranslate"><span class="pre">schema</span></code> widget type, a list of widget attributes can be included; with the
<code class="docutils literal notranslate"><span class="pre">non-editable-schema-editor</span></code>, a schema to be displayed is added instead.</p>
<p>An <strong>explicit schema</strong> using a property can be defined as the output schema and then will
be editable through the CDAP UI.</p>
<p>For example, a “Batch Source” plugin could have a configurable output schema named
<code class="docutils literal notranslate"><span class="pre">data-format</span></code>, displayed for editing with the <code class="docutils literal notranslate"><span class="pre">schema</span></code> widget-type, with a default
type of <code class="docutils literal notranslate"><span class="pre">string</span></code>, and a list of the types that are available:</p>
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;outputs&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;data-format&quot;</span><span class="p">,</span>
      <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;schema&quot;</span><span class="p">,</span>
      <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
        <span class="nt">&quot;schema-default-type&quot;</span><span class="p">:</span> <span class="s2">&quot;string&quot;</span><span class="p">,</span>
        <span class="nt">&quot;schema-types&quot;</span><span class="p">:</span> <span class="p">[</span>
          <span class="s2">&quot;boolean&quot;</span><span class="p">,</span>
          <span class="s2">&quot;int&quot;</span><span class="p">,</span>
          <span class="s2">&quot;long&quot;</span><span class="p">,</span>
          <span class="s2">&quot;float&quot;</span><span class="p">,</span>
          <span class="s2">&quot;double&quot;</span><span class="p">,</span>
          <span class="s2">&quot;string&quot;</span><span class="p">,</span>
          <span class="s2">&quot;map&lt;string, string&gt;&quot;</span>
        <span class="p">]</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span>
</pre></div>
</div>
<p>An <strong>implicit schema</strong> is a pre-determined output schema for a plugin that the plugin
developer enforces. The implicit schema is not associated with any properties of the
plugin, but instead shows the output schema of the plugin, to be used for visual display
only.</p>
<p>An example of this is from the <a class="reference external" href="https://github.com/cdapio/hydrator-plugins/blob/develop/core-plugins/widgets/KVTable-batchsource.json">KeyValueTable Batch Source plugin</a>:</p>
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;outputs&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;non-editable-schema-editor&quot;</span><span class="p">,</span>
      <span class="nt">&quot;schema&quot;</span><span class="p">:</span> <span class="p">{</span>
        <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;etlSchemaBody&quot;</span><span class="p">,</span>
        <span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;record&quot;</span><span class="p">,</span>
        <span class="nt">&quot;fields&quot;</span><span class="p">:</span> <span class="p">[</span>
          <span class="p">{</span>
            <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;key&quot;</span><span class="p">,</span>
            <span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;bytes&quot;</span>
          <span class="p">},</span>
          <span class="p">{</span>
            <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;value&quot;</span><span class="p">,</span>
            <span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;bytes&quot;</span>
          <span class="p">}</span>
        <span class="p">]</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span>
</pre></div>
</div>
<p>Widget types for output properties are limited to ensure that the schema that is
propagated across different plugins in the CDAP UI is consistent.</p>
</div>
<div class="section" id="stream-and-dataset-jumps">
<span id="plugins-presentation-jumps"></span><h3>Stream and Dataset Jumps<a class="headerlink" href="#stream-and-dataset-jumps" title="Permalink to this headline">🔗</a></h3>
<p>Beginning with version 1.3 of the specification, a plugin can be specified (using
<code class="docutils literal notranslate"><span class="pre">jump-config</span></code>) with a map of stream and dataset “jumps”. They specify which plugin
property names are either a stream or dataset that can be used, in the CDAP UI, to
directly jump to a detailed view of the stream or dataset.</p>
<p>This is an optional object, and if it is not present, no jump links will be created in the
CDAP UI. Jump links are not active in the CDAP Studio.</p>
<p>For example:</p>
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;metadata&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="c">...</span>
  <span class="p">},</span>
  <span class="nt">&quot;configuration-groups&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;KV Table Properties&quot;</span><span class="p">,</span>
      <span class="nt">&quot;properties&quot;</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;dataset-selector&quot;</span><span class="p">,</span>
          <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Dataset Name&quot;</span><span class="p">,</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;datasetName&quot;</span>
        <span class="p">}</span>
      <span class="p">]</span>
    <span class="p">}</span>
  <span class="p">],</span>
  <span class="nt">&quot;outputs&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;non-editable-schema-editor&quot;</span><span class="p">,</span>
      <span class="nt">&quot;schema&quot;</span><span class="p">:</span> <span class="p">{</span>
        <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;etlSchemaBody&quot;</span><span class="p">,</span>
        <span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;record&quot;</span><span class="p">,</span>
        <span class="nt">&quot;fields&quot;</span><span class="p">:</span> <span class="p">[</span>
          <span class="p">{</span>
            <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;key&quot;</span><span class="p">,</span>
            <span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;bytes&quot;</span>
          <span class="p">},</span>
          <span class="p">{</span>
            <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;value&quot;</span><span class="p">,</span>
            <span class="nt">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;bytes&quot;</span>
          <span class="p">}</span>
        <span class="p">]</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="p">],</span>
  <span class="nt">&quot;jump-config&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;datasets&quot;</span><span class="p">:</span> <span class="p">[{</span>
      <span class="nt">&quot;ref-property-name&quot;</span><span class="p">:</span> <span class="s2">&quot;datasetName&quot;</span>
    <span class="p">}]</span>
  <span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<p>In this example, the <code class="docutils literal notranslate"><span class="pre">datasetName</span></code> field of the <code class="docutils literal notranslate"><span class="pre">dataset-selector</span></code> will have a “jump” link added in the CDAP UI.</p>
</div>
</div>
<div class="section" id="example-widget-json">
<h2>Example Widget JSON<a class="headerlink" href="#example-widget-json" title="Permalink to this headline">🔗</a></h2>
<p>Based on the above specification, we can write a widget JSON for a <em>Batch Source</em> plugin
(with the properties of <em>name</em>, <em>basePath</em>, <em>duration</em>, <em>delay</em>, <em>groupByFields</em>,
<em>aggregates</em>, and an editable output <em>explicit schema</em>) as:</p>
<div class="highlight-json-ellipsis notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="nt">&quot;metadata&quot;</span><span class="p">:</span> <span class="p">{</span>
    <span class="nt">&quot;spec-version&quot;</span><span class="p">:</span> <span class="s2">&quot;&lt;spec-version&gt;&quot;</span>
  <span class="p">},</span>
  <span class="nt">&quot;configuration-groups&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="nt">&quot;label&quot;</span><span class="p">:</span> <span class="s2">&quot;Batch Source&quot;</span><span class="p">,</span>
      <span class="nt">&quot;properties&quot;</span><span class="p">:</span> <span class="p">[</span>
        <span class="p">{</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;dataset-selector&quot;</span><span class="p">,</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;name&quot;</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span><span class="p">,</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;basePath&quot;</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span><span class="p">,</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;duration&quot;</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span><span class="p">,</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;delay&quot;</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;textbox&quot;</span><span class="p">,</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;groupByFields&quot;</span><span class="p">,</span>
          <span class="nt">&quot;plugin-function&quot;</span><span class="p">:</span> <span class="p">{</span>
            <span class="nt">&quot;method&quot;</span><span class="p">:</span> <span class="s2">&quot;POST&quot;</span><span class="p">,</span>
            <span class="nt">&quot;widget&quot;</span><span class="p">:</span> <span class="s2">&quot;outputSchema&quot;</span><span class="p">,</span>
            <span class="nt">&quot;plugin-method&quot;</span><span class="p">:</span> <span class="s2">&quot;outputSchema&quot;</span><span class="p">,</span>
            <span class="nt">&quot;required-fields&quot;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&quot;groupByFields&quot;</span><span class="p">,</span> <span class="s2">&quot;aggregates&quot;</span><span class="p">],</span>
            <span class="nt">&quot;missing-required-fields-message&quot;</span><span class="p">:</span>
              <span class="s2">&quot;Both &#39;Group By Fields&#39; and &#39;Aggregates&#39; properties are required to fetch the schema.&quot;</span>
          <span class="p">}</span>
        <span class="p">},</span>
        <span class="p">{</span>
          <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;keyvalue-dropdown&quot;</span><span class="p">,</span>
          <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;aggregates&quot;</span><span class="p">,</span>
          <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
            <span class="nt">&quot;showDelimiter&quot;</span><span class="p">:</span> <span class="s2">&quot;false&quot;</span><span class="p">,</span>
            <span class="nt">&quot;kv-delimiter&quot;</span> <span class="p">:</span> <span class="s2">&quot;:&quot;</span><span class="p">,</span>
            <span class="nt">&quot;delimiter&quot;</span> <span class="p">:</span> <span class="s2">&quot;;&quot;</span><span class="p">,</span>
            <span class="nt">&quot;dropdownOptions&quot;</span><span class="p">:</span> <span class="p">[</span>
              <span class="s2">&quot;Avg&quot;</span><span class="p">,</span>
              <span class="s2">&quot;Count&quot;</span><span class="p">,</span>
              <span class="s2">&quot;First&quot;</span><span class="p">,</span>
              <span class="s2">&quot;Last&quot;</span><span class="p">,</span>
              <span class="s2">&quot;Max&quot;</span><span class="p">,</span>
              <span class="s2">&quot;Min&quot;</span><span class="p">,</span>
              <span class="s2">&quot;Stddev&quot;</span><span class="p">,</span>
              <span class="s2">&quot;Sum&quot;</span><span class="p">,</span>
              <span class="s2">&quot;Variance&quot;</span>
            <span class="p">]</span>
          <span class="p">}</span>
        <span class="p">}</span>
      <span class="p">]</span>
    <span class="p">}</span>
  <span class="p">],</span>
  <span class="nt">&quot;outputs&quot;</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span>
      <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;schema&quot;</span><span class="p">,</span>
      <span class="nt">&quot;widget-type&quot;</span><span class="p">:</span> <span class="s2">&quot;schema&quot;</span><span class="p">,</span>
      <span class="nt">&quot;widget-attributes&quot;</span><span class="p">:</span> <span class="p">{</span>
        <span class="nt">&quot;schema-default-type&quot;</span><span class="p">:</span> <span class="s2">&quot;string&quot;</span><span class="p">,</span>
        <span class="nt">&quot;schema-types&quot;</span><span class="p">:</span> <span class="p">[</span>
          <span class="s2">&quot;boolean&quot;</span><span class="p">,</span>
          <span class="s2">&quot;int&quot;</span><span class="p">,</span>
          <span class="s2">&quot;long&quot;</span><span class="p">,</span>
          <span class="s2">&quot;float&quot;</span><span class="p">,</span>
          <span class="s2">&quot;double&quot;</span><span class="p">,</span>
          <span class="s2">&quot;string&quot;</span><span class="p">,</span>
          <span class="s2">&quot;map&lt;string, string&gt;&quot;</span>
        <span class="p">]</span>
      <span class="p">}</span>
    <span class="p">}</span>
  <span class="p">]</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="specification-changes">
<span id="plugins-presentation-specification-changes"></span><h2>Specification Changes<a class="headerlink" href="#specification-changes" title="Permalink to this headline">🔗</a></h2>
<p>These changes describe changes added with each version of the specification.</p>
<ul class="simple">
<li><strong>1.1:</strong> Initial version of the specification.</li>
<li><strong>1.2:</strong> Added <a class="reference internal" href="#plugins-presentation-inputs"><span class="std std-ref">multiple inputs</span></a> for a plugin.</li>
<li><strong>1.3:</strong> Added <a class="reference internal" href="#plugins-presentation-jumps"><span class="std std-ref">jump-config</span></a> to specify which property
names are to be connected in the CDAP UI to a detailed view of a stream or dataset.</li>
<li><strong>1.4:</strong> Added <code class="docutils literal notranslate"><span class="pre">widget-type:</span> <span class="pre">hidden</span></code>.</li>
</ul>
</div>
</div>

</div>
    <div class="col-md-2">
      <div id="right-sidebar" class="bs-sidenav scrollable-y" role="complementary">
        <div id="localtoc-scrollspy">
        </div>
      </div>
    </div></div>
</div>
<!-- block main content end -->
<!-- block footer -->
<footer class="footer">
      <div class="container">
        <div class="row">
          <div class="col-md-2 footer-left"><a title="Creating a Plugin" href="creating-a-plugin.html" />Previous</a></div>
          <div class="col-md-8 footer-center"><a class="footer-tab-link" href="../../table-of-contents/../../reference-manual/licenses/index.html">Copyright</a> &copy; 2014-2020 Cask Data, Inc.&bull; <a class="footer-tab-link" href="//docs.cask.co/cdap/6.1.1/cdap-docs-6.1.1-web.zip" rel="nofollow">Download</a> an archive or
<a class="footer-tab-link" href="//docs.cask.co/cdap">switch the version</a> of the documentation
          </div>
          <div class="col-md-2 footer-right"><a title="Testing Plugins" href="testing-plugins.html" />Next</a></div>
        </div>
      </div>
    </footer>
<!-- block footer end -->
<script type="text/javascript" src="../../_static/bootstrap-3.3.6/js/bootstrap.min.js"></script><script type="text/javascript" src="../../_static/js/bootstrap-sphinx.js"></script><script type="text/javascript" src="../../_static/js/abixTreeList-2.js"></script><script type="text/javascript" src="../../_static/js/cdap-dynamicscrollspy-4.js"></script><script type="text/javascript" src="../../_static/js/cdap-version-menu.js"></script><script type="text/javascript" src="../../_static/js/copy-to-clipboard.js"></script><script type="text/javascript" src="../../_static/js/jquery.mousewheel.min.js"></script><script type="text/javascript" src="../../_static/js/jquery.mCustomScrollbar.js"></script><script type="text/javascript" src="../../_static/js/js.cookie.js"></script><script type="text/javascript" src="../../_static/js/tabbed-parsed-literal-0.2.js"></script><script type="text/javascript" src="../../_static/js/cdap-onload-javascript.js"></script><script type="text/javascript" src="../../_static/js/cdap-version-menu.js"></script>
    <script src="https://cdap.gitee.io/docs/cdap/json-versions.js"/></script>
  </body>
</html>